import StringUtils from './StringUtils'
const patterns = {
  PATTERN_ERA: 'G', //Era 标志符 Era strings. For example: "AD" and "BC"
  PATTERN_YEAR: 'y', //年
  PATTERN_MONTH: 'M', //月份
  PATTERN_DAY_OF_MONTH: 'd', //月份的天数
  PATTERN_HOUR_OF_DAY1: 'k', //一天中的小时数（1-24）
  PATTERN_HOUR_OF_DAY0: 'H', //24小时制，一天中的小时数（0-23）
  PATTERN_MINUTE: 'm', //小时中的分钟数
  PATTERN_SECOND: 's', //秒
  PATTERN_MILLISECOND: 'S', //毫秒
  PATTERN_DAY_OF_WEEK: 'E', //一周中对应的星期，如星期一，周一
  PATTERN_DAY_OF_YEAR: 'D', //一年中的第几天
  PATTERN_DAY_OF_WEEK_IN_MONTH: 'F', //一月中的第几个星期(会把这个月总共过的天数除以7,不够准确，推荐用W)
  PATTERN_WEEK_OF_YEAR: 'w', //一年中的第几个星期
  PATTERN_WEEK_OF_MONTH: 'W', //一月中的第几星期(会根据实际情况来算)
  PATTERN_AM_PM: 'a', //上下午标识
  PATTERN_HOUR1: 'h', //12小时制 ，am/pm 中的小时数（1-12）
  PATTERN_HOUR0: 'K', //和h类型
  PATTERN_ZONE_NAME: 'z', //时区名
  PATTERN_ZONE_VALUE: 'Z', //时区值
  PATTERN_WEEK_YEAR: 'Y', //和y类型
  PATTERN_ISO_DAY_OF_WEEK: 'u',
  PATTERN_ISO_ZONE: 'X'
}
const week = {
  ch: {
    '0': '\u65e5',
    '1': '\u4e00',
    '2': '\u4e8c',
    '3': '\u4e09',
    '4': '\u56db',
    '5': '\u4e94',
    '6': '\u516d'
  },
  en: {
    '0': 'Sunday',
    '1': 'Monday',
    '2': 'Tuesday',
    '3': 'Wednesday',
    '4': 'Thursday',
    '5': 'Friday',
    '6': 'Saturday'
  }
}
//获取当前时间
export function getCurrentTime() {
  var today = new Date()
  var year = today.getFullYear()
  var month = today.getMonth() + 1
  var day = today.getDate()
  var hours = today.getHours()
  var minutes = today.getMinutes()
  var seconds = today.getSeconds()
  var timeString = year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
  return timeString
}
/*
 * 比较时间大小
 * time1>time2 return 1
 * time1<time2 return -1
 * time1==time2 return 0
 */
export function compareTime(time1, time2) {
  var d1 = time1
  var d2 = time2
  if (typeof d1 === 'string') {
    d1 = new Date(Date.parse(d1.replace(/-/g, '/')))
  }
  if (typeof d2 === 'string') {
    d2 = new Date(Date.parse(d2.replace(/-/g, '/')))
  }
  var t1 = d1.getTime()
  var t2 = d2.getTime()
  if (t1 === t2) {
    return 0
  } else if (t1 > t2) {
    return 1
  }
  return -1
}
//是否闰年
export function isLeapYear(year) {
  return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0
}
//获取某个月的天数，从0开始
export function getDaysOfMonth(year, month) {
  return [31, this.isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]
}
export function getDaysOfMonth2(year, month) {
  // 将天置为0，会获取其上个月的最后一天
  month = parseInt(month) + 1
  var date = new Date(year, month, 0)
  return date.getDate()
}
/*距离现在几天的日期：负数表示今天之前的日期，0表示今天，整数表示未来的日期
 * 如-1表示昨天的日期，0表示今天，2表示后天
 */
export function fromToday(days) {
  var today = new Date()
  today.setDate(today.getDate() + days)
  var date = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate()
  return date
}
/**
 * 日期时间格式化
 * @param {Object} dateTime 需要格式化的日期时间
 * @param {String} pattern  格式化的模式，如yyyy-MM-dd hh(HH):mm:ss.S a k K E D F w W z Z
 */
export function formt(dateTime, pattern) {
  var date = new Date(dateTime)
  if (StringUtils.isBlank(pattern)) {
    return date.toLocaleString()
  }
  return pattern.replace(/([a-z])\1*/gi, function(matchStr, group1) {
    var replacement = ''
    switch (group1) {
      case patterns.PATTERN_ERA: //G
        break
      case patterns.PATTERN_WEEK_YEAR: //Y
      case patterns.PATTERN_YEAR: //y
        replacement = date.getFullYear()
        break
      case patterns.PATTERN_MONTH: //M
        var month = date.getMonth() + 1
        replacement = month < 10 && matchStr.length >= 2 ? '0' + month : month
        break
      case patterns.PATTERN_DAY_OF_MONTH: //d
        var days = date.getDate()
        replacement = days < 10 && matchStr.length >= 2 ? '0' + days : days
        break
      case patterns.PATTERN_HOUR_OF_DAY1: //k(1~24)
        var hours24 = date.getHours()
        replacement = hours24
        break
      case patterns.PATTERN_HOUR_OF_DAY0: //H(0~23)
        var hours24 = date.getHours()
        replacement = hours24 < 10 && matchStr.length >= 2 ? '0' + hours24 : hours24
        break
      case patterns.PATTERN_MINUTE: //m
        var minutes = date.getMinutes()
        replacement = minutes < 10 && matchStr.length >= 2 ? '0' + minutes : minutes
        break
      case patterns.PATTERN_SECOND: //s
        var seconds = date.getSeconds()
        replacement = seconds < 10 && matchStr.length >= 2 ? '0' + seconds : seconds
        break
      case patterns.PATTERN_MILLISECOND: //S
        var milliSeconds = date.getMilliseconds()
        replacement = milliSeconds
        break
      case patterns.PATTERN_DAY_OF_WEEK: //E
        var day = date.getDay()
        replacement = week['ch'][day]
        break
      case patterns.PATTERN_DAY_OF_YEAR: //D
        replacement = dayOfTheYear(date)
        break
      case patterns.PATTERN_DAY_OF_WEEK_IN_MONTH: //F
        var days = date.getDate()
        replacement = Math.floor(days / 7)
        break
      case patterns.PATTERN_WEEK_OF_YEAR: //w
        var days = dayOfTheYear(date)
        replacement = Math.ceil(days / 7)
        break
      case patterns.PATTERN_WEEK_OF_MONTH: //W
        var days = date.getDate()
        replacement = Math.ceil(days / 7)
        break
      case patterns.PATTERN_AM_PM: //a
        var hours24 = date.getHours()
        replacement = hours24 < 12 ? '\u4e0a\u5348' : '\u4e0b\u5348'
        break
      case patterns.PATTERN_HOUR1: //h(1~12)
        var hours12 = date.getHours() % 12 || 12 //0转为12
        replacement = hours12 < 10 && matchStr.length >= 2 ? '0' + hours12 : hours12
        break
      case patterns.PATTERN_HOUR0: //K(0~11)
        var hours12 = date.getHours() % 12
        replacement = hours12
        break
      case patterns.PATTERN_ZONE_NAME: //z
        replacement = getZoneNameValue(date)['name']
        break
      case patterns.PATTERN_ZONE_VALUE: //Z
        replacement = getZoneNameValue(date)['value']
        break
      case patterns.PATTERN_ISO_DAY_OF_WEEK: //u
        break
      case patterns.PATTERN_ISO_ZONE: //X
        break
      default:
        break
    }
    return replacement
  })
}
/**
 * 计算一个日期是当年的第几天
 * @param {Object} date
 */
export function dayOfTheYear(date) {
  var obj = new Date(date)
  var year = obj.getFullYear()
  var month = obj.getMonth() //从0开始
  var days = obj.getDate()
  var daysArr = [31, this.isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  for (var i = 0; i < month; i++) {
    days += daysArr[i]
  }
  return days
}
//获得时区名和值
export function getZoneNameValue(dateObj) {
  var date = new Date(dateObj)
  date = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()))
  var arr = date.toString().match(/([A-Z]+)([-+]\d+:?\d+)/)
  var obj = {
    name: arr[1],
    value: arr[2]
  }
  return obj
}

/** 获取时间段
 * @param type
 * 1 今日；
 * 2 近3天；
 * 3 近一周；
 * 4 近一个月；
 * 5 近3个月；
 * 6 近半年；
 * 7 近一年；
 */
export function getDateTimes(type) {
  var end = new Date()
  var start = new Date()
  start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
  var date = [start, end]

  switch (type) {
    case 1:
      break
    case 2:
      break
    case 3:
      break
    case 4:
      break
    case 5:
      break
    case 6:
      break
    case 7:
      break
    case 8:
      break
    default:
      break
  }
  return date
}

/**
 * 获取时间范围
 * @param {*间隔天数} intervalDays
 * @param {*是否今日之前} bolPastTime
 */
export function getDateRange(intervalDays, bolPastTime) {
  var dateNow = new Date()
  let oneDayTime = 24 * 60 * 60 * 1000
  let date = []
  let lastDay
  if (bolPastTime) {
    lastDay = new Date(dateNow.getTime() - intervalDays * oneDayTime)
    date.push(lastDay)
    date.push(dateNow)
  } else {
    lastDay = new Date(dateNow.getTime() + intervalDays * oneDayTime)
    date.push(dateNow)
    date.push(lastDay)
  }
  return date
}
/**
 * 获取时间差（毫秒）
 */
export function datedifference(sDate1, sDate2) {
  //sDate1和sDate2是2006-12-18格式
  var dateSpan, tempDate, iDays
  sDate1 = Date.parse(sDate1)
  sDate2 = Date.parse(sDate2)
  dateSpan = sDate2 - sDate1
  dateSpan = Math.abs(dateSpan)
  return dateSpan
}

export default {
  getCurrentTime,
  compareTime,
  isLeapYear,
  getDaysOfMonth,
  getDaysOfMonth2,
  fromToday,
  formt,
  dayOfTheYear,
  getZoneNameValue,
  getDateTimes,
  getDateRange,
  datedifference
}
